HQL (Hibernate Query Language) হল Hibernate এর জন্য তৈরি করা একটি Object-Oriented Query Language যা SQL এর মতো দেখতে হলেও SQL নয়। এটি Hibernate Entity Objects এবং তাদের প্রোপার্টিগুলির উপর ভিত্তি করে কাজ করে। HQL দিয়ে আপনি Java objects এবং database tables এর মধ্যে সম্পর্ক স্থাপন করতে পারেন এবং ডেটাবেস থেকে ডেটা পুনরুদ্ধার বা আপডেট করতে পারেন।
HQL এর মাধ্যমে SQL কোড লেখার প্রয়োজনীয়তা কমে যায় এবং ডেটাবেসের সাথে সম্পর্কিত Java classes এর মধ্যে ম্যাপিং সরাসরি ব্যবহার করা সম্ভব হয়।
HQL Query লিখা এবং Execute করা:
1. HQL এর মূল বৈশিষ্ট্য:
- HQL Object-Oriented: HQL ডেটাবেস টেবিলের পরিবর্তে Java objects এবং তাদের প্রপার্টি ব্যবহার করে।
- SQL-এর মতো: HQL SQL এর মতোই কাজ করে, কিন্তু এটি Java objects এবং তাদের properties এর সাথে কাজ করে।
- Case-insensitive: HQL query গুলি সাধারণত case-insensitive (অথবা অক্ষরের বড় এবং ছোট পার্থক্য থাকে না)।
2. HQL Query এর উদাহরণ
ধরা যাক, আমাদের Employee Entity Class আছে এবং আমরা এই ক্লাসের মাধ্যমে ডেটাবেসে কোয়েরি চালাতে চাই। নিচে HQL এর মাধ্যমে কিছু সাধারণ query example দেওয়া হলো:
import javax.persistence.*;
import java.util.List;
@Entity
@Table(name="employee")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
private String department;
private double salary;
// Getters and Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
3. HQL Query এর মাধ্যমে ডেটা Retrieve করা
Example 1: Simple HQL Query (Select All Employees)
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
import java.util.List;
public class HibernateApp {
public static void main(String[] args) {
// Create session factory
SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").addAnnotatedClass(Employee.class).buildSessionFactory();
// Create session
Session session = factory.getCurrentSession();
try {
// Start a transaction
session.beginTransaction();
// Create HQL query to get all employees
Query<Employee> query = session.createQuery("from Employee", Employee.class);
// Execute query and get result list
List<Employee> employees = query.getResultList();
// Display the results
for (Employee emp : employees) {
System.out.println(emp.getName());
}
// Commit transaction
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
Explanation:
from Employee: এটি HQL এর মাধ্যমে Employee Entity ক্লাসের সমস্ত রেকর্ডগুলি অনুরোধ করে।getResultList(): এই মেথডটি Employee তালিকাতে সমস্ত রেকর্ড ফেরত দেয়।
Example 2: Using WHERE Clause (Select Employees with Specific Condition)
public class HibernateApp {
public static void main(String[] args) {
SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").addAnnotatedClass(Employee.class).buildSessionFactory();
Session session = factory.getCurrentSession();
try {
session.beginTransaction();
// HQL query with WHERE condition
Query<Employee> query = session.createQuery("from Employee where department='IT'");
List<Employee> employees = query.getResultList();
for (Employee emp : employees) {
System.out.println(emp.getName());
}
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
Explanation:
where department='IT': এটি সেই সমস্ত Employee রেকর্ড ফেরত দেবে যেখানে department এর মান'IT'।
Example 3: Using LIKE Clause (Pattern Matching)
public class HibernateApp {
public static void main(String[] args) {
SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").addAnnotatedClass(Employee.class).buildSessionFactory();
Session session = factory.getCurrentSession();
try {
session.beginTransaction();
// HQL query using LIKE for pattern matching
Query<Employee> query = session.createQuery("from Employee where name like 'J%'");
List<Employee> employees = query.getResultList();
for (Employee emp : employees) {
System.out.println(emp.getName());
}
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
Explanation:
like 'J%': এটি সমস্ত Employee রেকর্ডগুলি ফেরত দেবে যার name 'J' দিয়ে শুরু হয়।
Example 4: Using ORDER BY Clause (Sorting Results)
public class HibernateApp {
public static void main(String[] args) {
SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").addAnnotatedClass(Employee.class).buildSessionFactory();
Session session = factory.getCurrentSession();
try {
session.beginTransaction();
// HQL query to get employees sorted by name
Query<Employee> query = session.createQuery("from Employee order by name");
List<Employee> employees = query.getResultList();
for (Employee emp : employees) {
System.out.println(emp.getName());
}
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
Explanation:
order by name: এটি সমস্ত Employee রেকর্ডগুলো name এর আঙ্গিক অনুযায়ী সজ্জিত করবে।
4. HQL Update এবং Delete Queries
Update Example: (Update Employee Salary)
public class HibernateApp {
public static void main(String[] args) {
SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").addAnnotatedClass(Employee.class).buildSessionFactory();
Session session = factory.getCurrentSession();
try {
session.beginTransaction();
// HQL query to update salary of employees
Query query = session.createQuery("update Employee set salary=5000 where department='IT'");
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
Explanation:
update Employee set salary=5000 where department='IT': এটি সকল IT বিভাগের কর্মীদের salary ৫০০০ করে আপডেট করবে।
Delete Example: (Delete Employee by ID)
public class HibernateApp {
public static void main(String[] args) {
SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").addAnnotatedClass(Employee.class).buildSessionFactory();
Session session = factory.getCurrentSession();
try {
session.beginTransaction();
// HQL query to delete an employee
Query query = session.createQuery("delete from Employee where id=1");
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
Explanation:
delete from Employee where id=1: এটিid=1এর Employee রেকর্ডটি ডিলিট করবে।
5. HQL Query Execution Summary
- HQL (Hibernate Query Language) ব্যবহার করে আপনি Java objects এর উপর ভিত্তি করে ডেটাবেস অপারেশন করতে পারেন, যেখানে SQL কোড লেখার প্রয়োজন নেই।
- HQL-এ object-oriented syntax ব্যবহার করা হয় যা SQL এর তুলনায় অনেক বেশি সুবিধাজনক এবং পাঠযোগ্য।
- আপনি select, update, delete, এবং insert অপারেশনগুলি HQL-এ সম্পাদন করতে পারেন, যেগুলির সাথে Java objects এবং database tables এর মধ্যে সম্পর্ক স্থাপন করতে হয়।
HQL Query Syntax সহজে ব্যবহারযোগ্য এবং Hibernate-এর শক্তিশালী ORM সক্ষমতা ব্যবহার করে object-relational mapping সহজ করে তোলে।